package com.yanxu.nio.c1;

import lombok.extern.slf4j.Slf4j;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author 折戟沉沙铁未销
 * @Description: byteBuffer 相关学习
 */
@Slf4j
public class Test1_ByteBuffer {
    public static void main(String[] args) throws IOException {
        FileChannel fileChannel = null;
        try {
            //获取 fileChannel
            fileChannel = new FileInputStream("data.txt").getChannel();

            //准备缓冲区
            ByteBuffer byteBuffer = ByteBuffer.allocate(10);

            //byteBuffer 的容量只有10个字节，有可能一次是读取不完的，因此需要在一个循环中不断的进行读取操作。
            while (true) {
                //从channel 中读取数据。
                //从channel 中读数据，其实就是向  bytebuffer 中写入数据。
                int i = fileChannel.read(byteBuffer);
                log.info("读取到的字节数为{}：", i);
                if (i <= 0) {
                    break;
                }

                //将 byteBuffer 中的数据读取出来。
                //flip 将 byteBuffer 切换成读模式
                byteBuffer.flip();
                while (byteBuffer.hasRemaining()) {
                    byte b = byteBuffer.get();
                    log.debug("实际字节{}", (char) b);
                }

                //byteBuffer 清空，同时切换成了写模式。
                //byteBuffer.clear()

                //压缩，并且切换成了写模式
                byteBuffer.compact();
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fileChannel != null) {
                fileChannel.close();
            }
        }

    }
}